Global hook to determine if Workers are allowed to fetch new jobs from Redis for execution#1103
Open
maxloginov wants to merge 3 commits intoAutomattic:masterfrom
Open
Global hook to determine if Workers are allowed to fetch new jobs from Redis for execution#1103maxloginov wants to merge 3 commits intoAutomattic:masterfrom
maxloginov wants to merge 3 commits intoAutomattic:masterfrom
Conversation
…m Redis for execution. Hook function can be set up with kue.createQueue (through the options object):
let kuePaused = true;
const kuePostponeJobsPickupForExecutionStrategy = function(jobType: string) {
const pause = kuePaused || memoryUsageSummaryMB >= (MEMORY_AVAILABLE_MB - 60);
console.log(
'Kue strategy to postpone new jobs pickup for execution, if memory is low.',
'Memory usage (MB)', memoryUsageSummaryMB, 'out of', MEMORY_AVAILABLE_MB,
pause ? 'KUE PAUSED' : ''
);
return pause ? 5000 : 0;
};
const q = kue.createQueue({
...
postponeWorker: kuePostponeJobsPickupForExecutionStrategy,
...
});
Hook function should return a number: 0 if fetching a job is allowed immediately (with zero delay), or a positive integer representing a timeout in milliseconds to postpone this Worker's attempts to fetch new jobs for execution by this timeout. After the timeout, Worker is going to make an attempt to fetch a new job again, and will request postponeWorker hook function again, to determine if this time it is allowed to pick up a job for execution, or should delay again. And so on and on.
Possible use case for this is to globally prevent Kue from uncontrollably grabbing new jobs for execution (for all job types or for a certain job type), if JS node is hitting upper memory limit, or if it's too much CPU used. With this feature, adaptive dynamic balancers can be implemented for better control over stability and scalability of Kue-based applications between many nodes (there is a good usage for this feature for single-noded applications as well, to control if the application is staying within host's quotas).
Author
|
Cannot pass the check 5, though this update has absolutely no influence on this piece.
|
Open
* master: Trying to clarify the wording around pausing. Update .travis.yml - no need v4 and v7 Update .travis.yaml - cover node v8 as well Update .travis.yaml - test platforms by node LTS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Hook function can be set up with kue.createQueue (through the options object):
let kuePaused = true;
const kuePostponeJobsPickupForExecutionStrategy = function(jobType: string) {
const pause = kuePaused || memoryUsageSummaryMB >= (MEMORY_AVAILABLE_MB - 60);
console.log(
'Kue strategy to postpone new jobs pickup for execution, if memory is low.',
'Memory usage (MB)', memoryUsageSummaryMB, 'out of', MEMORY_AVAILABLE_MB,
pause ? 'KUE PAUSED' : ''
);
return pause ? 5000 : 0;
};
const q = kue.createQueue({
...
postponeWorker: kuePostponeJobsPickupForExecutionStrategy,
...
});
Hook function should return a number: 0 if fetching a job is allowed immediately (with zero delay), or a positive integer representing a timeout in milliseconds to postpone this Worker's attempts to fetch new jobs for execution by this timeout. After the timeout, Worker is going to make an attempt to fetch a new job again, and will request postponeWorker hook function again, to determine if this time it is allowed to pick up a job for execution, or should delay again. And so on and on.
Possible use case for this is to globally prevent Kue from uncontrollably grabbing new jobs for execution (for all job types or for a certain job type), if JS node is hitting upper memory limit, or if it's too much CPU used. With this feature, adaptive dynamic balancers can be implemented for better control over stability and scalability of Kue-based applications between many nodes (there is a good usage for this feature for single-noded applications as well, to control if the application is staying within host's quotas).